/*
 * Copyright (c)  2017
 * All rights reserved.
 * ProductInfo.java 2017-09-13 下午7:47
 */

package com.ueboot.weishop.entity.goods;

import com.ueboot.weishop.entity.IDEntity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;


/**
 * 描述: 商品销售规格（商品价格与库存表（原始价））
 * 如果一个商品存在不同的规格，而且规格不同价格不同。使用单独的表存放这些关系
 * 由于每个商品的规格不同，且会存在多个规格决定一个价格，无法用字段存放关系。
 * 这里采用字符串拼接方式实现，要求对规格的顺序有严格要求，否则无法匹配到价格。
 * 示例：
 * 机油的规格存在以下三种：
 * 1.粘度
 *     - 全合成0W-40 SN级 (id:1)
 *     - 全合成5W-40 SN级 (id:2)
 * 2.容量
 *     - 1L (id:3)
 *     - 4L (id:4)
 * 3.系列
 *      - 美孚一号 (id:5)
 *      - 速霸 (id:6)
 * 对应的价格由三者的并集组合而成
 *
 * - 1/3/5:11900
 * - 1/3/6:14900
 * - 1/4/5:11900
 * - 1/4/6:19900
 *
 * @author yangkui create on 2017-09-13 下午7:47.
 * @since 1.0
 */
@Data
@NoArgsConstructor
@Entity(name = "WS_GOODS_SALES_SPEC")
public class GoodsSalesSpecEntity extends IDEntity {
    /**
     * 分隔符
     */
    public static final String SPLIT_CHAR="/";
    /**
     * 销售区域：全国统一价
     */
    public static final String SALES_REGION_ALL="ALL";
    /**
     * 销售区域：分地区定价
     */
    public static final String SALES_REGION_NOT_ALL="NOT_ALL";
   /* @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "WS_GOODS_SALES_SPEC")
    @GenericGenerator(name = "WS_GOODS_SALES_SPEC", strategy = "enhanced-table", parameters = {
            @org.hibernate.annotations.Parameter(name = "table_name", value = "WS_TABLE_SEQUENCE"),
            @org.hibernate.annotations.Parameter(name = "segment_value", value = "WS_GOODS_SALES_SPEC"),
            @org.hibernate.annotations.Parameter(name = "optimizer", value = "pooled") })
    @Column(name = "ID",columnDefinition = "INT(20) COMMENT 'id主键'",length = 20)
    private Long id;*/

    @Id
    @Column(name = "ID", nullable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_WS_GOODS_SALES_SPEC")
    @SequenceGenerator(name = "SEQ_WS_GOODS_SALES_SPEC", allocationSize = 1, sequenceName = "SEQ_WS_GOODS_SALES_SPEC")
    private Long id;

    /**
     * 用于匹配规格可选值的value全路径，采用/分割
     */
    @Column(name = "SPEC_VALUE_FULL_PATH_VALUE",columnDefinition = "VARCHAR(200) COMMENT '用于匹配规格值的ID全路径，采用/分割'",length = 200)
    private String specValueFullPathValue;

    /**
     * 用于匹配规格值的名称全路径，采用/分割。用于编辑商品价格时使用。
     */
    @Column(name = "SPEC_VALUE_FULL_PATH_NAME",columnDefinition = "VARCHAR(2000) COMMENT '用于匹配规格值的名称全路径，采用/分割。用于编辑商品价格时使用。'",length = 2000)
    private String specValueFullPathName;

    /**
     * 保存规格值在页面上渲染时的字段名称，用于反向生成表格时使用。采用/分割。
     */
    @Column(name = "SPEC_VALUE_FULL_PATH_FIELD",columnDefinition = "VARCHAR(2000) COMMENT '保存规格值在页面上渲染时的字段名称，用于反向生成表格时使用。采用/分割。'",length = 2000)
    private String specValueFullPathFieldName;

    /**
     * 保存页面上渲染价格列表时需要用到的一些表格基础数据，便于商品编辑时，可以还原当初动态生成的表格设置数据
     * 保存的格式为json.具体定义参见页面表格定义
     */
    @Column(name = "SPEC_VALUE_VIEW_DATA",columnDefinition = "VARCHAR(2000) COMMENT '保存页面上渲染价格列表时需要用到的一些表格基础数据，便于商品编辑时，可以还原当初动态生成的表格设置数据'",length = 2000)
    private String specValueViewData;

    /**
     * 销售价格：单位分。用这个价格当正式的支付价格
     */
    @Column(name = "PRICE",columnDefinition = "INT(11) COMMENT '价格：单位分'",length = 11)
    private Integer price;

    /**
     * 原始价格：单位分
     */
    @Column(name = "ORIGIN_PRICE",columnDefinition = "INT(11) COMMENT '价格：单位分'",length = 11)
    private Integer originPrice;

    /**
     * 每种规格组合起来的库存数量
     */
    @Column(name = "STOCK",columnDefinition = "INT(11) COMMENT '每种规格组合起来的库存数量'",length = 11)
    private Integer stock;
    /**
     * 内部编号
     */
    @Column(name = "SN",columnDefinition = "VARCHAR(20) COMMENT '内部编号'",length = 25)
    private String sn;
    /**
     * 内部名称
     */
    @Column(name = "NAME",columnDefinition = "VARCHAR(20) COMMENT '内部名称'",length = 50)
    private String name;

    /**
     * 扩展字段1
     */
    @Column(name = "EXT1",columnDefinition = "VARCHAR(50) COMMENT '扩展字段1'",length = 50)
    private String ext1;

    /**
     * 扩展字段2
     */
    @Column(name = "EXT2",columnDefinition = "VARCHAR(50) COMMENT '扩展字段2'",length = 50)
    private String ext2;

    /**
     * 扩展字段3
     */
    @Column(name = "EXT3",columnDefinition = "VARCHAR(50) COMMENT '扩展字段3'",length = 50)
    private String ext3;

    /**
     * 所属商品
     */
    @ManyToOne
    @JoinColumn(name="GOODS_INFO_ID",columnDefinition = "INT(20) COMMENT '所属商品'")
    private GoodsInfoEntity goodsInfo;
}